#! /usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2020-04-19 10:14
# @Author : youngchaolin

print()

'''
列表推导式：用一行代码，构建一个比较复杂并且有规律的列表。
列表推导式分为两种：
（1）循环模式：[加工后变量 for 变量 in iterable]
（2）筛选模式：[加工后变量 for 变量 in iterable if 条件]
'''

# 使用普通方式构建列表[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
li = []
for i in range(1, 11, 1):
    li.append(i)
print(li)

# 使用列表推导式 --是循环模式
li = [i for i in range(1, 11)]
print(li)

'''
循环模式
'''

# 1 将10以内的所有整数的平方写入到列表
li = [i ** 2 for i in range(1, 11)]
print(li)

# 2 100以内所有的偶数写入到列表
li = [i for i in range(2, 102, 2)]
print(li)

# 3 将python1期到python200期写入列表
li = [f'python{i}期' for i in range(1, 201)]
print(li)

'''
筛选模式
'''

# 1 30以内能被3整除的数
li = [i for i in range(1, 31) if i % 3 == 0]
print(li)

# 2 过滤掉长度小于3的字符串列表，并将剩下的转换成大写字母
li = ['messi', 'ronald', 'herry', 'a', 'b', 'c']
li_2 = [s.upper() for s in li if len(s) > 2]
print(li_2)

# 3 找到嵌套列表中名字含有两个'e'的所有名字全大写
names = [['tom', 'jerry', 'jefferson', 'andrew', 'steven'], ['alice', 'ana', 'wendy', 'jennifer', 'sherry']]
# 正常写法
li = []
for name in names:
    for s in name:
        # 使用count方法判断
        if s.count('e') == 2:
            li.append(s.upper())

print(li)

# 使用列表推导式，比较牛逼的写法
li=[name.upper() for l in names for name in l if name.count('e')==2]
print(li)



'''
生成器表达式
与列表推导式几乎一样，只是写时需要加一个小括号，也有循环模式和筛选模式
'''
li=[i for i in range(1,11)]
print(li)
# 生成器表达式
li=((i for i in range(1,11)))
print(li)
print(next(li))
print(next(li))
print(next(li))
print(next(li))

'''
列表推导式总结：
1 有毒，会让人沉迷，比较适合构建有规律的的列表
2 需要三层循环才能构建的列表或其他可迭代对象，不建议使用
3 不方便debug查找问题

优点：
1 一行构建，写法简答
2 装逼
'''

# 装逼写法
# 构建一个列表[2,3,4,5,6,7,8,9,'J','Q','K','A']
# 创建列表的两种方式，列表推导式和list创建
li=[s for s in range(2,10)]+list('JQKA')
print(li)

'''
生成器表达式和列表推导式的区别：
1 写法有区别，列表推导式使用[]，生成器表达式使用()
2 生成器表达式本质是iterator，列表推导式本质上是iterable
'''

li=[i for i in range(1,11)]
print('__iter__' in dir(li)) # True，说明列表推导式本质上是iterable
li=(i for i in range(1,11))
print('__iter__' in dir(li) and '__next__' in dir(li)) # True，说明生成器表达式本质是iterator


'''
字典推导式-了解
'''
l1=['name','age','salary']
l2=['clyang',22,9000]
li={l1[i]:l2[i] for i in range(len(l1))}
print(li)

'''
集合推导式-了解
'''
l1=[1,2,3,-4,-5,-6]
s={abs(number) for number in l1}
print(s)
